/******************************************************************************
 * FileName:    gwin_dev_info_pkt.c
 * Desc:        设备信息数据包
 *
 *
 * Author:      Lin
 * Notes:
 *
 ******************************************************************************/

#ifndef _GWIN_DEV_INFO_PKT_H_
#define _GWIN_DEV_INFO_PKT_H_


/*-------------------------- Includes ---------------------------------------*/
#include "stdint.h"
#include "string.h"
#include "stdlib.h"
#include "stdio.h"

#include "mi_config.h"

#include "gwin_product_info.h"


/*-------------------------- Macro Definitions ------------------------------*/
#define GWIN_GAP_ADTYPE_MANUFACTURER_SPECIFIC           0xFF                    // 蓝牙广播数据格式 类型：制造商特定的数据0xFF

#define GWIN_COMPANY_ID                                 0x0C46                  // 厂商ID

#define GWIN_PRODUCT_LINE_MAIN(a)                       ( ((a) >> 16) & 0xFF )  // 产品线编号
#define GWIN_PRODUCT_LINE_SUB(a)                        ( ((a) >> 8) & 0xFF )   // 产品线编号
#define GWIN_SERIAL_NUMBER(a)                           ( ((a) >> 0) & 0xFF )   // 产品线编号

#define GWIN_GAP_ADV_PAYLOAD_LEN(a)                     ( (a) - 1 )             // 广播包格式：len(后面数据的长度) + type + payload


/*-------------------------- Type Declarations ------------------------------*/
/**
 * @brief 协议类型
 */
typedef enum
{
    GWIN_PROT_TYPE_COMM_WIFI_V27        = 0x01,         // 0x01:Combo Wi-Fi V27
    GWIN_PROT_TYPE_COMM_WIFI_V3,                        // 0x02:Combo Wi-Fi V3

    GWIN_PROT_TYPE_COMM_BLE_V2          = 0xA1,         // 0xA1:BLE V2（无加密）
    GWIN_PROT_TYPE_COMM_BLE_V3,                         // 0xA2:BLE V3（移位加密）

    GWIN_PROT_TYPE_CELLUAR_4G_IMEI_15   = 0xB1,         // 0xB1:蜂窝（15位IMEI）
    GWIN_PROT_TYPE_CELLUAR_4G_IMEI_17,                  // 0xB2:蜂窝（17位IMEI）

    GWIN_PROT_TYPE_COMM_WIFI_B6S        = 0xC1,         // 0xC1:米家B6SWiFi串口固件
    GWIN_PROT_TYPE_COMM_B05P,                           // 0xC2:米家B05P蓝牙串口固件
    GWIN_PROT_TYPE_COMM_B09P,                           // 0xC3:米家B09P串口固件

    GWIN_PROT_TYPE_LIGHT                = 0xD1,         // 0xD1:米家照明方案
    GWIN_PROT_TYPE_ELEC,                                // 0xD2:米家电工方案
}gwin_protocol_type_t;

/**
 * @brief 遥控协议类型
 */
typedef enum
{
    GWIN_REMOTE_PROT_TYPE_NONE,                         // 0：无遥控器
    GWIN_REMOTE_PROT_TYPE_V3,                           // 1：广云v3
    GWIN_REMOTE_PROT_TYPE_V3_NO_SECURITY,               // 2：广云v3（无加密）
    GWIN_REMOTE_PROT_TYPE_LUO_GE_LANG,                  // 3：罗格朗协议
}gwin_remote_protocol_type_t;


#pragma pack(1)

/**
 * @brief 广云产品信息包
 *          包头
 */
typedef struct
{
    uint8_t ble_adv_len;                        // 蓝牙广播数据格式 长度
    uint8_t ble_adv_type;                       // 蓝牙广播数据格式 类型

    uint16_t company_id;                        // 厂商ID（2Byte）
    uint8_t prot_type;                          // 协议类型（1Byte）
    uint16_t pid;                               // 产品短PID（2Byte）
    struct                                      // 广云固件完整版本号（8 Byte）
    {
        struct                                  // 广云固件项目缩写（3 Byte）
        {
            uint8_t product_line;               // 产品线编号
            uint8_t product_line_sub;           // 产品线子编号
            uint8_t serial_number;              // 项目序号
        }project_index;
        struct                                  // SDK版本号（3 Byte）
        {
            uint8_t major;                      // 模组固件主版本号
            uint8_t minor;                      // 模组固件子版本号
            uint8_t revision;                   // 模组固件子版本号
        }sdk_version;
        uint16_t app_version;                   // 子版本号（2Byte）
    }fw_version;
    uint8_t mac_addr[6];                        // mac地址（6Byte）
}dev_info_pkt_head_t;


/**
 * @brief 广云产品信息包
 *          串口应答包
 */
typedef struct
{
    dev_info_pkt_head_t head;                   // 头信息

    // 硬件特性参数
    struct                                      // 客户端发现标识位（1byte=8bit）
    {
        uint8_t ble_adv_scan            : 1;    // 连接状态 0：不可发现；1：可发现
        uint8_t reserve1                : 1;    // 预留 bit1
        uint8_t reserve2                : 1;    // 预留 bit2
        uint8_t reserve3                : 1;    // 预留 bit3
        uint8_t reserve4                : 1;    // 预留 bit4
        uint8_t reserve5                : 1;    // 预留 bit5
        uint8_t reserve6                : 1;    // 预留 bit6
        uint8_t reserve7                : 1;    // 预留 bit7
    }flag;
    uint8_t check_sum;                          // 校验和（1Byte）
}dev_info_pkt_comm_rsp_t;


/**
 * @brief 广云产品信息包
 *          串口广播包
 */
typedef struct
{
    dev_info_pkt_head_t head;                   // 头信息

    // 硬件特性参数
    // 驱动方式
    uint8_t sub_version;                        // 范围：0-255

    uint8_t reserve1;                           // 保留
    uint8_t reserve2;                           // 保留
    uint8_t reserve3;                           // 保留
    uint8_t reserve4;                           // 保留
    uint8_t reserve5;                           // 保留

    uint8_t check_sum;                          // 校验和（1Byte）
}dev_info_pkt_comm_adv_t;


/**
 * @brief 广云产品信息包
 *          米家照明方案
 */
typedef struct
{
    dev_info_pkt_head_t head;                   // 头信息

    // 硬件特性参数
    // 驱动方式
    uint8_t ac_is_exist         : 1;            // AC
    uint8_t fill_light_is_exist : 1;            // 辅光
    uint8_t reserve1            : 2;            // 保留
    uint8_t pwm_cal_model       : 4;            // 驱动方式，1：CW恒功率；2：CW叠加；3：CCT2线；4：I2C RGBCW

    uint8_t pwm_min;                            // 最低亮度，单位：0.1%
    uint8_t pwm_fre_cold;                       // 灯光PWM频率 冷光 单位：100hz
    uint8_t pwm_fre_warm;                       // 灯光PWM频率 暖光 单位：100hz

    // 遥控器版本
    uint8_t reserve2            : 4;            // 保留
    uint8_t remote_proc_version : 4;            // 遥控器版本，0：无遥控器；1：广云V3；2：广云V3（不加密）

    uint8_t sub_version;                        // 范围：0-255

    uint8_t check_sum;                          // 校验和（1Byte）
}dev_info_pkt_light_t;


/**
 * @brief 广云产品信息包
 *          米家电工方案
 */
typedef struct
{
    dev_info_pkt_head_t head;                   // 头信息

    // 硬件特性参数
    // 当前供电方式/按键数
    uint8_t elec_type           : 4;            // 当前供电方式
    uint8_t key_cnt             : 4;            // 按键数 1-8键
    // 有无背光/遥控器协议
    uint8_t back_light          : 4;            // 有无背光
    uint8_t remote_proc_version : 4;            // 遥控器版本，0：无遥控器；1：广云V3；2：广云V3（不加密）

    uint8_t sub_version;                        // 范围：0-255

    uint8_t reserve3;                           // 保留
    uint8_t reserve4;                           // 保留
    uint8_t reserve5;                           // 保留

    uint8_t check_sum;                          // 校验和（1Byte）
}dev_info_pkt_elec_t;

#pragma pack()


/*-------------------------- Global Variables -------------------------------*/

/*-------------------------- Local Variables --------------------------------*/

/*-------------------------- Functions Declarations -------------------------*/

/*-------------------------- Functions Definitions --------------------------*/
void gwin_main_dev_info_pkt_comm_rsp(uint8_t *data, uint8_t len,    // 数据包
                                        uint8_t *mac_addr,          // mac地址
                                        uint8_t ble_adv_scan);      // 连接状态 0：不可发现；1：可发现

void gwin_main_dev_info_pkt_comm_adv(uint8_t *data, uint8_t len,    // 数据包
                                        uint8_t *mac_addr,          // mac地址
                                        uint16_t pid);              // 产品短PID

void gwin_main_dev_info_pkt_light(uint8_t *data, uint8_t len,       // 数据包
                                        uint8_t *mac_addr,          // mac地址
                                        uint8_t ac_is_exist,        // AC
                                        uint8_t fill_light_is_exist,// 辅光
                                        uint8_t pwm_cal_model,      // 驱动方式
                                        uint16_t pwm_min,           // 最低亮度
                                        uint16_t pwm_fre_cold,      // 灯光PWM频率 冷光
                                        uint16_t pwm_fre_warm);     // 灯光PWM频率 暖光

void gwin_main_dev_info_pkt_elec(uint8_t *data, uint8_t len,        // 数据包
                                        uint8_t *mac_addr,          // 当前供电方式
                                        uint8_t elec_type,          // 按键数 1-8键
                                        uint8_t key_cnt);           // 有无背光


#endif // _GWIN_DEV_INFO_PKT_H_


/*-------------------------- END OF FILE ------------------------------------*/

